# 导入所需的库
from sklearn.datasets import load_iris
from xgboost import XGBClassifier, plot_importance
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target

# 数据集分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=12345)

# 创建 XGBoost 分类模型
clf = XGBClassifier(
    booster='gbtree',  # 模型求解方式
    objective='multi:softmax',  # 多分类任务，使用 softmax 目标函数
    num_class=3,  # 类别数量
    gamma=0.1,  # 节点分裂所需的最小损失函数下降值
    max_depth=6,  # 最大树深
    reg_lambda=2,  # L2 正则化项
    subsample=0.7,  # 随机采样比例
    colsample_bytree=0.7,  # 每棵树随机采样的特征比例
    min_child_weight=3,  # 子节点中样本的最小权重和
    eta=0.1,  # 学习率
    seed=1000,
    nthread=4,  # 使用的线程数
    eval_metric=['mlogloss', 'merror']  # 评估指标
)

# 训练模型
clf.fit(X_train, y_train)

# 预测测试集
y_pred = clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy * 100:.2f}%')

# 可视化特征重要性
plot_importance(clf)
plt.show()